package com.muyu.util;

import io.swagger.annotations.ApiModelProperty;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

/**
 * @ClassName: SwaggerUtils
 * @Author: Zirun.Xin
 * @Date: 2025/4/15 上午11:01
 * @Version: 1.0
 * @Description: aop切面工具工具
 */
@Component
public class AOPUtils {

    /**
     * 获取指定类中所有带有{@code @ApiModelProperty}注解的字段名与注解值的映射集合
     * 返回的Map会按照字段名自动排序（使用TreeMap实现）
     *
     * @param classPath 要检查的类的全限定名（包含包名）
     * @return 返回一个TreeMap，其中key为字段名，value为对应的{@code @ApiModelProperty}注解值
     * 以下情况会返回null：
     * - 类不存在
     * - 类没有字段
     * - 所有字段都没有{@code @ApiModelProperty}注解
     * @throws RuntimeException 当指定的类找不到时抛出（包装了原始的ClassNotFoundException）
     * @see ApiModelProperty
     */
    public Map<String, String> getApiModelProperty(String classPath) {

        try {
            // 1.根据类路径获取类
            Class<?> c = Class.forName(classPath);

            // 2.获取类的属性
            List<Field> declaredFields = Arrays.asList(c.getDeclaredFields());

            // 3.遍历属性，获取属性上ApiModelProperty的值，属性的名，存入res
            if (CollectionUtils.isEmpty(declaredFields)) return null;
            Map<String, String> res = declaredFields.stream()
                    .filter(field -> field.getAnnotation(ApiModelProperty.class) != null)
                    .collect(Collectors.toMap(
                            Field::getName, field -> field.getAnnotation(ApiModelProperty.class).value(),
                            (oldValue, newValue) -> newValue, TreeMap::new)
                    );

            return res;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
